You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.9 KiB
85 lines
1.9 KiB
/**
|
|
* POST /api/orders/confirm/[id]
|
|
*
|
|
* Confirm an order after mock payment
|
|
*
|
|
* Security:
|
|
* - Requires authentication
|
|
* - Users can only confirm their own orders
|
|
* - Order must be in 'pending' status
|
|
*
|
|
* Behavior:
|
|
* - Updates order status: 'pending' → 'completed'
|
|
* - Stores completion timestamp
|
|
* - Clears user's cart
|
|
* - Returns order details
|
|
*
|
|
* Response:
|
|
* {
|
|
* success: true
|
|
* order: Order
|
|
* message: string
|
|
* }
|
|
*/
|
|
|
|
import { eq, and } from 'drizzle-orm'
|
|
import { orders, cartItems } from '../../../database/schema'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
// Require authentication
|
|
const { user } = await requireUserSession(event)
|
|
|
|
// Get order ID from URL parameter
|
|
const orderId = getRouterParam(event, 'id')
|
|
|
|
if (!orderId) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: 'Order ID is required',
|
|
})
|
|
}
|
|
|
|
const db = useDatabase()
|
|
|
|
// Fetch order
|
|
const order = await db.query.orders.findFirst({
|
|
where: and(eq(orders.id, orderId), eq(orders.userId, user.id)),
|
|
})
|
|
|
|
if (!order) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
statusMessage: 'Order not found',
|
|
})
|
|
}
|
|
|
|
// Validate order status
|
|
if (order.status !== 'pending') {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: `Order cannot be confirmed. Current status: ${order.status}`,
|
|
})
|
|
}
|
|
|
|
// Update order status to completed
|
|
const [updatedOrder] = await db
|
|
.update(orders)
|
|
.set({
|
|
status: 'completed',
|
|
paymentCompletedAt: new Date(),
|
|
paymentId: `MOCK-${Date.now()}`, // Mock payment ID
|
|
updatedAt: new Date(),
|
|
})
|
|
.where(eq(orders.id, orderId))
|
|
.returning()
|
|
|
|
// Clear user's cart
|
|
const cart = await getOrCreateCart(event)
|
|
await db.delete(cartItems).where(eq(cartItems.cartId, cart.id))
|
|
|
|
return {
|
|
success: true,
|
|
order: updatedOrder,
|
|
message: 'Bestellung erfolgreich bestätigt',
|
|
}
|
|
})
|
|
|